#include <iostream>

#if 0
    // 懒汉式单例：对象在调用时进行构建
    class Singleton
    {
    public:
        static Singleton *getinstance()
        {
            // 要用的时候才开始构建对象
            if(instance == nullptr)
            {
                instance = new Singleton; // 构建一个新的对象
            }
            return instance;
        }

    private:
        Singleton() {} // 将构造函数私有
        static Singleton *instance;
    };
    Singleton *Singleton::instance = nullptr;
#endif

#if 0
    // 饿汉式单例：程序开始时就构建
    class Singleton
    {
    public:
        static Singleton *getinstance()
        {
            return instance;
        }

    private:
        Singleton() {}
        static Singleton *instance;
    };
    Singleton *Singleton::instance = new Singleton;
#endif

#if 1
    // 新式单例写法（皆有懒汉和饿汉的特点）
    // 不用的时候不会构建对象，但是一旦构建了对象，就不能销毁
    class Singleton
    {
    public:
        static Singleton *getinstance()
        {
            static Singleton instance;
            return &instance;
        }

    private:
        Singleton() {}
    };
#endif

int main()
{
    auto obj  = Singleton::getinstance();
    return 0;
}